//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.util.StringTokenizer;
//
//public class Main{
//    public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//    public static StringTokenizer st;
//
//    public static String next() throws IOException {
//        while(st==null|| !st.hasMoreTokens()){
//            st=new StringTokenizer(br.readLine());
//        }
//
//        return st.nextToken();
//    }
//
//    public static String nextLine() throws IOException{
//        return br.readLine();
//    }
//
//    public static boolean hasNext() throws IOException {
//        return br.ready();
//    }
//
//    public static int nextInt() throws IOException {
//        return Integer.parseInt(next());
//    }
//
//    public static void main(String[] args) throws IOException{
//
//
//    }
//
//
//
//}


import java.util.*;

public class Main {
    // 直线类，表示直线方程 Ax + By + C = 0
    static class Line {
        double A, B, C; // 直线方程的系数


        Line(double a, double b, double c) {
            A = a;
            B = b;
            C = c;
        }
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt(); // 读取激光的数量
        List<Line> lines = new ArrayList<>(); // 存储所有激光的直线方程
        double maxB = 0; // 记录所有激光的最大 y 值

// 生成所有激光的直线方程
        for (int i = 0; i < n; i++) {
            double a = scan.nextDouble(); // 读取激光的起点 y 值
            double b = scan.nextDouble(); // 读取激光的终点 y 值
// 计算直线方程：两点式转换为一般式 Ax + By + C = 0
// 这里假设激光从 (0, a) 到 (2e5, b)，计算直线方程
            lines.add(new Line(b - a, -2e5, 1e5 * (a + b)));

// 更新最大 y 值/;.
            maxB = Math.max(maxB, Math.max(a, b));
        }

// 使用二分法寻找最优垂直线 x = c
        double left = -1e5; // 二分左边界
        double right = 1e5; // 二分右边界
        double ans = maxB; // 初始值为最大可能的 y 值
        double eps = 1e-6; // 精度控制

// 进行二分搜索
        while (right - left > eps) {
            double mid = (left + right) / 2;
// 计算 mid 处的最大 y 值
            double yMid = computeMaxY(mid, lines);
// 计算 mid + eps 处的最大 y 值
            double yMidPlus = computeMaxY(mid + eps, lines);
// 比较 yMid 和 yMidPlus，调整二分边界
            if (yMid < yMidPlus) {
                right = mid;
                ans = Math.min(ans, yMid);
            } else {
                left = mid;
                ans = Math.min(ans, yMidPlus);
            }
        }

// 输出结果，保留两位小数
        System.out.printf("%.2f\n", ans);
    }

    static double computeMaxY(double c, List<Line> lines) {
        double maxY = 0; // 初始化为一个很小的数
// 遍历所有激光的直线方程
        for (Line line : lines) {
// 计算直线在 x = c 时的 y 值
            double y = -(line.A * c + line.C) / line.B;
// 更新最大 y 值
            maxY = Math.max(maxY, y);
        }
        return maxY;
    }
}





//
//
//static int[] p;
//
//
//public static void main1(String[] args) throws IOException {
//    int n=nextInt();
//    int m=nextInt();
//
//    p=new int[n+1];
//    for(int i=1;i<n+1;i++) p[i]=i;
//
//    while (m-->0){
//        int u=nextInt();
//        int v=nextInt();
//        int w=nextInt();
//
//
//
//
//    }
//
//
//
//
//
//
//}
//
//public static int find(int x){
//
//    if(p[x]!=x) p[x]=find(p[x]);
//
//    return p[x];
//}
//
//public static boolean union(int x,int y){
//    int rx=find(x);
//    int ry=find(y);
//
//    if(rx!=ry){
//        p[ry]=rx;
//        return true;
//    }
//
//    return false;
//}

